树的匹配与递归方法

题目描述

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。

题解

双递归方法
主函数递归:寻找与B相同的子节点
如果两个树都为空,匹配失败
判断当前节点是否与B吻合
不吻合,递归判断左节点与b,递归判断右节点与b

子函数递归:遍历子树判断是否每个节点都相同
当b为空,说明匹配完成,true
当a为空,说明匹配错误,false
当前节点相同,递归匹配左节点 递归匹配右节点

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        // 判断是否为空
        if(A == NULL || B==NULL) return false;
        // 判断当前节点是否合适
        if(recur(A,B))  return true;
        // 递归
        if (isSubStructure(A->left,B) || isSubStructure(A->right,B)) return true;

        return false;
    }

    bool recur(TreeNode* A, TreeNode* B){
        if(B==NULL) return true;
        if(A==NULL) return false;
        if(A->val != B->val) return false;
        return recur(A->left,B->left) && recur(A->right,B->right);
    }
};